#include "hal.h"
#include "cilindrica.h"
#include "relay.h"
#include "terminal.h"
#include "sensors.h"
#include "timers.h"
#include "inversor_frequencia.h"

Controle gControleCilindrica;

/**********************************************************************************
 * Descrição:
 *
 * Paramêtro(s):
 *					-
 * Retorno:
 *					-
 **********************************************************************************/
enum {
	eDesligaTodosAcionamentos,
	eMonitoraSensorFimCurso,
	eMonitoraSensorS1,
	eMonitoraSensorS2,
	eMonitoraContadorVolta,
	eMonitoraTeclaInicioProcesso,
	eMonitoraTempoMeioCiclo,
	eMonitoraTotalCiclo,
	eMonitorSensor2,
	eMonitorSensor21,
	eLigaMotorMola1,
	eDesligaMotorMola1,
	eMonitorSensor1,
	eLigaInversorMotorBraco,
}enum_EstadosProcessoCilindrica;

void ProcessoCilindrica(void){
	static uint8_t lEstadoAtual=eDesligaTodosAcionamentos; // estado inicial


		switch (lEstadoAtual) {
			case eDesligaTodosAcionamentos:

				lEstadoAtual=eMonitoraSensorFimCurso;
				break;
			case eMonitoraSensorFimCurso:
				//Sensor de fim de curso acionado?
				if (sensores.input.s3) {//Liga o motor de mola
                                        delay_ms(300);
                                        ParadaMotorMola();
                                        lEstadoAtual = eMonitoraSensorS1;
				} else {//Desliga o motor da Mola
					RecuoMotorMola();//duvida
				}
				break;
			case eMonitoraSensorS1:
				//Sensor S1
				if (!sensores.input.s2) {//Liga o motor de avanco da mola
					//AvancoMotorMola();
				} else {//Desliga o  motor avanco da Mola
					ParadaMotorMola();
					lEstadoAtual = eMonitoraSensorS2;
				}
				break;
			case eMonitoraSensorS2:
				//Sensor S2 melhorar leitura para avancar mais
				if ((!sensores.input.s1||sensores.input.s2)&&(sensores.input.s2)) {//Retorna
					AvancoMotorMola();
					
				} else {//Desliga o  motor avanco da Mola
					ParadaMotorMola();
                                        lEstadoAtual = eMonitoraTeclaInicioProcesso;
				}
				break;
			case eMonitoraTeclaInicioProcesso:
				if (gTerminal.input.ligado) {//Liga o motor de avanco da mola
					AvancoMotorMola();
					lEstadoAtual = eMonitoraContadorVolta;
				} else if(sensores.input.s1)
                                {
					lEstadoAtual = eMonitoraSensorFimCurso;
				}
				break;
			case eMonitoraContadorVolta:
				// verifica o numero de voltas Duvida?
                                delay_ms(2000);
				if(1){
					//Desliga motor mola
					ParadaMotorMola();
					//Liga a bomba de agua
					relay_active(PORT_RELAYS,RELAY_AGUA);
					//Tempo de 3s
					delay_ms(3000);
					//seleciona a velocidade
					inversor_frequencia_init(20,gVelocidadeInversor);
					//Liga inversor de sentido 1
					inversor_sentido1();
                                        
					//tempo de 1s
					delay_ms(1000);
					lEstadoAtual= eLigaInversorMotorBraco;
				}

				break;
			case eLigaInversorMotorBraco:
				//Monitora a metade do tempo do ciclo
				inversor_frequencia_on();
				lEstadoAtual = eMonitoraTempoMeioCiclo;
				break;
			case eMonitoraTempoMeioCiclo:
				if((gControleCilindrica.TempoOperacao)>=(gControleCilindrica.TempoSelecionado/2)){//monitora a metade do tempo ciclo
					//Desliga do motor do braco
					ParadaMotorMola();
					//desliga o inversor
                                        relay_deactive(PORT_MOTORES,RELAY_MOTOR_BRACO);
					relay_deactive(PORT_RELAYS_INV,RELAY_HABILITA_INV);
					//Tempo de 2s
					delay_ms(2000);
					//liga o inverso sentido2
					inversor_sentido2();
					//tempo 1s
					delay_ms(1000);
					//liga motor do braco
					relay_active(PORT_MOTORES,RELAY_MOTOR_BRACO);
                                        relay_active(PORT_RELAYS_INV,RELAY_HABILITA_INV);
					lEstadoAtual = eMonitoraTotalCiclo;
				}
				break;
			case eMonitoraTotalCiclo:
				if ((gControleCilindrica.TempoOperacao)>=(gControleCilindrica.TempoSelecionado)) {//se o ciclo total terminou
					//desliga inversor
					inversor_frequencia_off();
					//desliga motor braco
					relay_deactive(PORT_MOTORES,RELAY_MOTOR_BRACO);
					//desliga bomba dagua
					relay_deactive(PORT_RELAYS,RELAY_AGUA);

					lEstadoAtual = eMonitorSensor2;
				}
				break;
			case eMonitorSensor2:
				if (!sensores.input.s1 && !sensores.input.s2) {
					//desliga motor mola
					ParadaMotorMola();
                                        lEstadoAtual = eMonitorSensor1;
				} else {
					//aciona motor de retorno da mola
					RecuoMotorMola();
				}
				break;
			case eMonitorSensor1:
				if (!sensores.input.s1) {
					
				} else {
					//aciona motor de avanço da mola
                                        lEstadoAtual = eMonitorSensor21;          
					RecuoMotorMola();
				}
				break;
			case eMonitorSensor21://final
				if(sensores.input.s3){//monitora o tempo timeout
					//Desliga motor da Mola
                                        delay_ms(300);
					ParadaMotorMola();
					lEstadoAtual = eMonitoraSensorFimCurso ;
					//verificar final de processo
				}
				break;
			default:
				break;
		}

}
